package com.jch.wns.websocket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.stream.ChunkedWriteHandler;

public class WebSocketChannelInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        // Netty 框架实现的 HttpRequestDecoder和HttpResponseEncoder组合 用于处理HTTP编解码
        ch.pipeline().addLast("http-codec",new HttpServerCodec()); //使用默认解码器选项

        // 聚合工具
        // 将HttpMessage及其后续HttpContent聚合为单个FullHttpRequest或FullHttpResponse
        // （取决于它是否用于处理请求或响应）的ChannelHandler ，没有后续的HttpContent 。
        // 当您不想处理传输编码为“分块”的 HTTP 消息时，它很有用。
        // 如果用于处理响应，则在ChannelPipeline HttpResponseDecoder之后插入此处理程序，如果用于处理请求，
        // 则在ChannelPipeline中的HttpRequestDecoder和HttpResponseEncoder之后插入此处理程序
        ch.pipeline().addLast("aggregator",new HttpObjectAggregator(65536));

        // 一个ChannelHandler ，它增加了对异步写入大数据流的支持，既不消耗大量内存也不得到OutOfMemoryError 。
        // 文件传输等大数据流需要在ChannelHandler实现中进行复杂的状态管理。
        // ChunkedWriteHandler管理如此复杂的状态，以便您可以毫无困难地发送大数据流
        ch.pipeline().addLast("http-chunked",new ChunkedWriteHandler());

        ch.pipeline().addLast(new WebSocketServerHandler());
    }
}
